热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

本文|发生_FlutterーAuthentication认证

篇首语:本文由编程笔记#小编为大家整理,主要介绍了FlutterーAuthentication认证相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Flutter ー Authentication 认证相关的知识,希望对你有一定的参考价值。




Flutter ー Authentication 认证




原文 https://medium.com/@simbu/flutter-authentication-adb8df7cf673



前言


如果我相信我知道你是谁那我就能让你查看你的个人 应用 application 资料。


身份验证可能是应用程序必须处理的最大的交叉问题。


将它作为一个特性添加到 DigestablePrologue 允许我们多次抽象和重用它,并通过更新一组代码来减少维护。


正文


业务需求


让我们从一个高层次的、故意模糊的业务需求开始:



“该应用程序将能够使用现代身份验证保护对屏幕和 API 的访问”



经过最初的交谈,我们决定接受这个要求:




  • 滑动登录屏幕。


  • 使用 Microsoft AD 或 Google Firebase 进行身份验证。


  • 在设置中注销。

然后,我们举办了一个研讨会,通过示例创建规范:





Login slide up specification



Login slide up specification






Auth service specification



认证服务规范






Logout setting specification



注销设置规范



并将它们转换为可执行规范:





Login screen feature tests


登录屏幕功能测试





Authentication service feature tests


身份验证服务特性测试





Logout setting feature tests


注销设置特性测试


为了缩短这篇文章的篇幅,我已经部分实现了注销设置,跳过了即将添加的 AD & Firebase 身份验证服务。


因此,特性测试的结果不再完全反映最初的规范,但是一旦深入细节,范围或方向的改变是正常的。


我发表的所有关于认证和数据访问主题的文章将很快通过一篇摘要文章(一个迷你系列文章)结合在一起。


开始


从 app_config 读取环境。Json 文件,该文件在应用程序启动时加载,并由为 live 和 UAT 进行的 CodeMagic 集成构建注入:





根据环境选择身份验证服务:


AuthenticationServiceStateNotifier selectAuthenticationServiceByEnvironment() 

  var environment = GlobalEnvironmentValues.instance.environment;


  AuthenticationService authenticationService = environment == Environments.live

      ? LiveAuthenticationService()

      : environment == Environments.uat

          ? UatAuthenticationService()

          : StubbedAuthenticationService();


  return AuthenticationServiceStateNotifier(authenticationService);




final authenticationServiceProvider &#61; StateNotifierProvider<

    AuthenticationServiceStateNotifier, AuthenticationService>(

  (ref) &#61;> selectAuthenticationServiceByEnvironment(),

);

当应用程序启动时&#xff0c;它会检测存根身份验证服务并自动验证用户:


if (ref.read(authenticationServiceProvider).typeName &#61;&#61;

        AuthenticationService.authenticationServiceTypeNameStubbed) 

        ref.read(authenticationProvider.notifier).setIsAuthenticated(true);



这个设置屏幕是使用一个很棒的包 sets_ui 添加的&#xff0c;它允许用户注销&#xff0c;并调用身份验证服务上的 signOut 方法:





Sign Out setting



注销设置



我们的自动化特性测试涵盖了所有内容:





Login feature test report



登录功能测试报告






Authentication feature test report



认证特性测试报告



在未来的帖子中&#xff0c;当我们添加 UAT 和 Live 环境时&#xff0c;它会在未经身份验证时路由到登录屏幕&#xff0c;并调用真正的身份验证服务来获取访问令牌&#xff0c;这些令牌将被 Flutter Data 用来进行安全的 API 请求。


登录屏幕和身份验证服务已经添加到 DigestablePrologue&#xff0c;设置屏幕添加到 DigestableMe。


引发导航事件 navigation events


为了响应导航&#xff0c;我在路由器上增加了一个观察者


MaterialApp.router(

 ...

    navaigationObservers: [

       NavigationEventsObserver(ref.read(eventStoreProvider))

    ],

 ...

)

每次导航发生时&#xff0c;它都会在事件总线上引发 Navigated 事件:


/// Raises Nativigated events when the GoRouter navigates.

class NavigationEventsObserver extends NavigatorObserver 

  final EventStore eventStore;

  NavigationEventsObserver(this.eventStore);




  &#64;override

  void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) 

    raiseNavigatedEvent(route.settings.name ?? "");

  


  &#64;override

  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) 

    raiseNavigatedEvent(route.settings.name ?? "");

  


  &#64;override

  void didReplace( Route<dynamic>? newRoute, Route<dynamic>? oldRoute ) 

    raiseNavigatedEvent(newRoute?.settings.name ?? "");

  



  void raiseNavigatedEvent(String routeName) 

    even(fn)tStore.bus.fire(Navigated(routeName));

  



然后测试可以使用它来证明导航操作已经发生&#xff0c;当前事件存储仅保留最后一个 Navigated 事件。


通过侦听事件并记录它们&#xff0c;我很可能会 extension 这个功能来添加应用程序监视。


Flutter App 生命周期


为了在唤醒时强制执行所需的身份验证&#xff0c;我需要使用重写来捕获应用程序状态(AppLificycleState)。


&#64;override

  void didChangeAppLifecycleState(AppLifecycleState state) 

    ref.read(appLifecycleStateProvider.notifier)

  .setLifecycleState(state);

    ref.read(authenticationServiceProvider.notifier)

  .checkAuthenticated();

  




可观察的生命周期事件(AppLificycleState) :




  • Inactive ー应用程序处于非活动状态&#xff0c;不接收用户输入。这个事件只能在 ios 上运行&#xff0c;因为在 android 上没有等效的事件可以映射到


  • 暂停ー应用程序当前对用户不可见&#xff0c;不响应用户输入&#xff0c;并在后台运行。这相当于 Android 中的 onPace()


  • 应用程序可见并响应用户输入&#xff0c;这相当于 Android 中的 onPostResume()


  • 暂停ー 应用 application 暂停。这相当于 Android 中的 onStop; 它不会在 iOS 上触发&#xff0c;因为在 iOS 上没有可映射到的等价事件

功能测试支持你





Feature tests letting us know we have broken other features



特性测试让我们知道我们已经破坏了其他特性



这是伟大的&#xff0c;我已经做了一些相当大的变化&#xff0c;但我知道我需要修复&#xff0c;以避免任何回归错误。


测试的契约确保应用程序仍然能够完成早期特性所要求的工作。


特性测试认证


事实证明&#xff0c;要使特性测试通过非常困难&#xff0c;但是为了确保身份验证按计划工作&#xff0c;将它们放在适当的位置是值得的。


主要问题是在测试步骤运行之前从文件加载环境&#xff0c;这意味着我们已经运行了检查身份验证和重定向到登录屏幕的逻辑。


在几次尝试通过代码改变环境失败后&#xff0c;我选择了一套单独的特性测试:





Gherkin feature test config that loads the live config value file.



Gherkin 特性测试配置&#xff0c;加载实时配置值文件。



加载不同的环境配置文件:





Live config value file



实时配置值文件



它需要更多的维护&#xff0c;但是很有必要&#xff0c;因为我们将在集成和部署构建中注入配置文件以保护秘密值。


使用事件来解决难以实现的、特征化的测试步骤


登录特性的一些步骤很难实现&#xff0c;因为功能将在使用微应用程序 DigestablePrologue 的父应用程序 DigestableMe 中实现:


When: Making an API request

这意味着我们无法在 DigestablePrologue 中导航到屏幕或发出 API 请求。


这是一个耦合问题&#xff0c;我们可以用事件总线来解决。





应用程序现在只是侦听事件并采取适当的操作&#xff0c;允许我们在步骤中引发事件&#xff0c;而不是实际的导航或 API 调用。


何时: 发出 API 请求事件: API 请求


使用 EventBus 还有其他优点&#xff0c;我们可以在以后添加这些优点&#xff0c;例如记录引发的事件。


规程 ーー 执行特性步骤


使用 Flutter Gherkin 最乏味的部分是创建所有的步骤方法&#xff0c;我将尝试使用构建器来自动创建包含要填写的框架步骤的文件。


与此同时&#xff0c;我使用可视化代码中的高亮来规范所需的步骤&#xff0c;例如:





这样说:


Given: Always on authentication

And: Not authenticated

And: authenticated


When: The application is started

When: The application awakes

When: Making an API request

When: Displaying a restricted screen

When: Displaying an unrestricted screen


Then: The application routes to the &#39;Login Screen&#39;

And: Records the current screen for redirection

然后将骨架方法添加到步骤文件中


路线授权


具有自定义属性的路由角色&#xff0c;则可以实现基于非角色的路由&#xff0c;大家暂时可以&#xff0c;但可以 extension 。


没有实现登录/id/auth 的受限屏幕&#xff0c;因为它的一些不同之处&#xff0c;它的授权和路由保护&#xff0c;在需要时通过 GoRouter 重定向作为保护。


Packages




  • event_bus


  • settings_ui

结束语


如果本文对你有帮助&#xff0c;请转发让更多的朋友阅读。


也许这个操作只要你 3 秒钟&#xff0c;对我来说是一个激励&#xff0c;感谢。


祝你有一个美好的一天~




© 猫哥




  • 微信 ducafecat




  • https://wiki.ducafecat.tech




  • https://video.ducafecat.tech



本文由 mdnice 多平台发布


推荐阅读
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 我正在尝试将Firebase添加到涉及添加以下内容的现有应用程序中:classpath'com.googl ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 触发器的稳态数量分析及其应用价值
    本文对数据库中的SQL触发器进行了稳态数量的详细分析,探讨了其在实际应用中的重要价值。通过研究触发器在不同场景下的表现,揭示了其在数据完整性和业务逻辑自动化方面的关键作用。此外,还介绍了如何在Ubuntu 22.04环境下配置和使用触发器,以及在Tomcat和SQLite等平台上的具体实现方法。 ... [详细]
  • Java环境中Selenium Chrome驱动在大规模Web应用扩展时的性能限制分析 ... [详细]
  • 理解和应用HTTP请求中的转发与重定向机制
    在HTTP请求处理过程中,客户端发送请求(通常简称为req),服务器进行相应处理后返回响应(通常简称为res)。理解和应用客户端的转发与重定向机制是前端开发的重要内容。这两种机制在Web开发中具有关键作用,能够有效管理和优化用户请求的处理流程。转发机制允许服务器内部将请求传递给另一个资源,而重定向则指示客户端向新的URL发起新的请求,从而实现页面跳转或资源更新。掌握这些技术有助于提升应用的性能和用户体验。 ... [详细]
  • 在数据仓库管理中,定时更新程序与查询SQL之间的冲突常常导致性能瓶颈和阻塞问题。为了解决这些问题,通常需要对SQL Server进行详细的性能诊断。常用的诊断工具包括系统动态管理视图(DMVs)和扩展事件(Extended Events),这些工具能够帮助识别和分析性能瓶颈的具体原因,从而采取有效的优化措施。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
author-avatar
rwp4677210
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有